#ifndef _WT588F_BOARD_H_
#define _WT588F_BOARD_H_

#include <config.h>
#include <stdbool.h>

#if _BOARD_TYPE_ == _V33_A_BOARD_
/* 定义相关驱动引脚 */
// 数据线（双向）
#define WT588F_DATA_PIN                                   GPIO_Pin_14
// 忙信号输出线
#define WT588F_BUSY_PIN                                   GPIO_Pin_15
// 电源控制
#define WT588F_POWER_CONTORL_PIN                          GPIO_Pin_20

#elif _BOARD_TYPE_ == _V33_B_BOARD_
/* 定义相关驱动引脚 */
// 数据线（双向）
#define WT588F_DATA_PIN                                   GPIO_Pin_6
// 忙信号输出线
#define WT588F_BUSY_PIN                                   GPIO_Pin_0
// 电源控制
#define WT588F_POWER_CONTORL_PIN                          GPIO_Pin_5

#elif _BOARD_TYPE_ == _V33_C_BOARD_
/* 定义相关驱动引脚 */
// 数据线（双向）
#define WT588F_DATA_PIN                                   GPIO_Pin_11
// 忙信号输出线
#define WT588F_BUSY_PIN                                   GPIO_Pin_10
#endif

// 等待电平稳定时间 - 5ms
#define WT588F_WAIT_LEVEL_STABLE_TIME                     (5ul)
// 高电平时间      - 600us
#define WT588F_BIT_HIGH_LEVEL_TIME                        (600ul)
// 低电平时间      - 200us
#define WT588F_BIT_LOW_LEVEL_TIME                         (200ul)

// 任务回调
typedef void (*Wt588fAudioPlaybackTask_t)(void);

/**
 * @brief 事件类型
 *
 */
typedef enum
{
  WT588F_AUDIO_PLAYBACK = 1 << 0, // 消息发送
} Wt588fTypeOfEvent_t;

/**
 * @brief 外部接口
 *
 */
typedef struct
{
  Wt588fAudioPlaybackTask_t AudioPlaybackCallback; // 语音播放
} Wt588fExternalInterfaces_t;

/**
 * @brief 微秒延时
 *
 * @param Us - 延时的时间
 */
extern void Wt588fDelayUs(uint16_t Us);

/**
 * @brief 毫秒延时
 *
 * @param Ms - 延时的时间
 */
extern void Wt588fDelayMs(uint16_t Ms);

/**
 * @brief 设置数据管脚电平
 *
 * @param PinLevel - 管脚电平状态（true：高电平 false：低电平）
 */
extern void Wt588fSetDataPinLevel(bool PinLevel);

/**
 * @brief 获取忙信号管脚电平
 *
 * @return bool - 管脚电平（true：高电平 false：低电平）
 */
extern bool Wt588fGetBusyPinLevel(void);

/**
 * @brief 设置电源控制管脚电平
 *
 * @param PinLevel - 管脚电平状态（true：高电平 false：低电平）
 */
extern void Wt588fSetPowerContorlPinLevel(bool Level);

/**
 * @brief 获取音量等级
 *
 * @return uint8_t - 音量等级
 */
extern uint8_t Wt588fGetVolumeLevel(void);

/**
 * @brief 获取免打扰标识
 *
 * @return bool - 使能位（true：打开 false：关闭）
 */
extern bool Wt588fGetDoNotDisturbFlag(void);

/**
 * @brief 获取设备繁忙标识
 *
 * @return bool - 繁忙标识（true：繁忙 false：空闲）
 */
extern bool Wt588fGetBusyStatus(void);

/**
 * @brief 设置设备繁忙标识
 *
 * @param Status - 繁忙标识（true：繁忙 false：空闲）
 */
extern void Wt588fSetBusyStatus(bool Status);

/**
 * @brief 发送一字节
 *
 * @param Byte - 待发送的字节
 */
extern void Wt588fSendOneByte(uint8_t Byte);

/**
 * @brief 发送一段数据
 *
 * @param pDataIn - 待发送的数据流
 * @param SizeIn  - 数据流长度
 */
extern void Wt588fSendDataBuff(uint8_t *pDataIn, uint8_t SizeIn);

/**
 * @brief 分配所需的内存空间
 *
 * @param MallocSize - 内存块的大小，以字节为单位
 * @return uint8_t*  - 指向已分配大小的内存。如果请求失败，则返回 NULL
 */
extern uint8_t *Wt588Malloc(uint16_t MallocSize);

/**
 * @brief 释放已分配的内存
 *
 * @param ptr - 指针指向一个要释放内存的内存块
 */
extern void Wt588fFree(void *ptr);

/**
 * @brief 获取系统时间
 *
 * @return uint32_t - 当前系统时间
 */
extern uint32_t Wt588fGetSystemClockTime(void);

/**
 * @brief 停止语音播放任务
 *
 */
extern void Wt588fStopAudioPlaybackTask(void);

/**
 * @brief 延时启动语音播放任务
 *
 * @param Ms - 延时的时间
 */
extern void Wt588fDelayedStartAudioPlaybackTask(uint32_t Ms);

/**
 * @brief 立即启动语音播放任务
 *
 */
extern void Wt588fStartAudioPlaybackNoWait(void);

/**
 * @brief 板载功能初始化
 *
 * @param pExternalInterfaces - 外部调用方法
 */
extern void Wt588fBoardInitialization(Wt588fExternalInterfaces_t *pExternalInterfaces);

#endif
